
/**
 * 多线程共享数据的方式有两种：
 * 一、如果多个线程执行的业务代码相同，如：(售票系统)都是减余票数量
 *     解决方案：
 *     共享的数据(余票数量)放在共同的Runnable实现中
 * 二、如果多个线程执行的业务代码不同，如：一个加，一个减...
 *     解决方案1：
 *     共享变量放在外部类中，作为成员变量
 *     解决方案2：
 *     共享变量放在单独的一个对象中，多个线程的不同Runable实现调用这个对象
 *     使用这同一个对象来实现数据共享
 */
public class MultiThreadShareDataWays {
	
	private int j = 0;

	public static void main(String [] args) {
		
		MultiThreadShareDataWays mtsd = new MultiThreadShareDataWays();
		
		/*一、
		 * MyShareData1 myShareData1 = new MyShareData1(); 
		
		for(int i=0;i<10;i++){
			new Thread(myShareData1).start();
		}
		
		myShareData1.getCount();*/
		
		new Thread(mtsd.new MyShareData2()).start();
		new Thread(mtsd.new MyShareData3()).start();
		
	}
	
	private synchronized void inc() {
		j++;
		System.out.println("inc. j =" + j);
	}
	
	private synchronized void dec() {
		j--;
		System.out.println("dec. j =" + j);
	}
	
	class MyShareData2 implements Runnable {
		public void run() {
			inc();
		}
	}
	
	class MyShareData3 implements Runnable {
		public void run() {
			dec();
		}
	}
	
}

class MyShareData1 implements Runnable{
	
	private int count = 100;
	
	public synchronized void run() {
		count-- ;
	}
	
	public void getCount() {
		System.out.println("count = " + count);
	}
	
}
